import pymysql

from config import DBCONFIG_INFO


class DBTools(object):
    # 创建连接方法 - 静态方法 - 没有参数
    @staticmethod
    def __create_connect():
        conn = pymysql.connect(**DBCONFIG_INFO)
        return conn


    # 查询方法 -- 查询一条数据
    @staticmethod
    def query_one(sql):
        conn = None
        cursor = None
        res = None
        try:
            # 获取连接
            conn = DBTools.__create_connect()
            # 创建游标
            cursor = conn.cursor()
            # 执行 查询SQL 语句
            cursor.execute(sql)
            # 提取结果集
            res = cursor.fetchone()
        except Exception as err:
            print("执行查询SQL错误：", err)
            raise
        finally:
            # 关游标
            cursor.close()
            # 关连接
            conn.close()
            # 返回结果集
            return res

    # 查询方法 -- 查询多条数据，能指定位置
    @staticmethod
    def query_many(sql, idx, n):
        conn = None
        cursor = None
        res = None
        try:
            # 获取连接
            conn = DBTools.__create_connect()
            # 创建游标
            cursor = conn.cursor()
            # 执行 查询SQL 语句
            cursor.execute(sql)
            # 修改游标位置
            cursor.rownumber = idx - 1
            # 提取结果集:查询，获取 n条 数据，从游标下一个位置提取
            res = cursor.fetchmany(n)
        except Exception as err:
            print("执行查询SQL错误：", err)
            raise
        finally:
            # 关游标
            cursor.close()
            # 关连接
            conn.close()
            # 返回结果集
            return res

    # 查询方法 -- 查询全部数据
    @staticmethod
    def query_all(sql):
        conn = None
        cursor = None
        res = None
        try:
            # 获取连接
            conn = DBTools.__create_connect()
            # 创建游标
            cursor = conn.cursor()
            # 执行 查询SQL 语句
            cursor.execute(sql)
            # 提取结果集
            res = cursor.fetchall()
        except Exception as err:
            print("执行查询SQL错误：", err)
            raise
        finally:
            # 关游标
            cursor.close()
            # 关连接
            conn.close()
            # 返回结果集
            return res

    # 增删改方法
    @staticmethod
    def insert_delete_update(sql):
        conn = None
        cursor = None
        res = None
        try:
            # 获取连接
            conn = DBTools.__create_connect()
            # 创建游标
            cursor = conn.cursor()
            # 执行sql -- 增、删、改
            res = cursor.execute(sql)
            # 提交事务
            conn.commit()
            print(f"增、删、改操作成功！影响：{res}行")
        except Exception as err:
            conn.rollback()
            print("执行增删改SQL错误：", err)
            raise
        finally:
            # 关游标
            cursor.close()
            # 关连接
            conn.close()
            # 返回结果集